﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MarkdEdit.markdown
{
    public class CSSConsts
    {
        #region 默认CSS样式

        public const string DefaultCss = @"
        body {
            font-family: sans-serif;
            font-size: 14px;
            line-height: 1.6;
            padding-top: 10px;
            padding-bottom: 10px;
            background-color: white;
            padding: 30px;
        }

        body>*:first-child {
            margin-top: 0 !important;
        }

        body>*:last-child {
            margin-bottom: 0 !important;
        }

        a {
            color: #4183C4;
        }

        a.absent {
            color: #cc0000;
        }

        a.anchor {
            display: block;
            padding-left: 30px;
            margin-left: -30px;
            cursor: pointer;
            position: absolute;
            top: 0;
            left: 0;
            bottom: 0;
        }

        h1,
        h2,
        h3,
        h4,
        h5,
        h6 {
            margin: 20px 0 10px;
            padding: 0;
            font-weight: bold;
            -webkit-font-smoothing: antialiased;
            cursor: text;
            position: relative;
        }

        h1:hover a.anchor,
        h2:hover a.anchor,
        h3:hover a.anchor,
        h4:hover a.anchor,
        h5:hover a.anchor,
        h6:hover a.anchor {
            /* no-repeat 10px center; */
            text-decoration: none;
        }

        h1 tt,
        h1 code,
        h2 tt,
        h2 code,
        h3 tt,
        h3 code,
        h4 tt,
        h4 code,
        h5 tt,
        h5 code，h6 tt,
        h6 code {
            font-size: inherit;
        }

        h1 {
            font-size: 28px;
            color: black;
        }

        h2 {
            font-size: 24px;
            border-bottom: 1px solid #cccccc;
            color: black;
        }

        h3 {
            font-size: 18px;
        }

        h4 {
            font-size: 16px;
        }

        h5 {
            font-size: 14px;
        }

        h6 {
            color: #777777;
            font-size: 14px;
        }

        p,
        blockquote,
        ol,
        dl,
        table,
        pre {
            margin: 15px 0;
        }

        ul {
            margin: 0;
        }

        hr {
            background: transparent repeat-x 0 0;
            border: 0 none;
            color: #cccccc;
            height: 4px;
            padding: 0;
        }

        body>h2:first-child {
            margin-top: 0;
            padding-top: 0;
        }

        body>h1:first-child {
            margin-top: 0;
            padding-top: 0;
        }

        body>h1:first-child+h2 {
            margin-top: 0;
            padding-top: 0;
        }

        body>h3:first-child,
        body>h4:first-child,
        body>h5:first-child,
        body>h6:first-child {
            margin-top: 0;
            padding-top: 0;
        }

        a:first-child h1,
        a:first-child h2,
        a:first-child h3,
        a:first-child h4,
        a:first-child h5,
        a:first-child h6 {
            margin-top: 0;
            padding-top: 0;
        }

        h1 p,
        h2 p,
        h3 p,
        h4 p,
        h5 p,
        h6 p {
            margin-top: 0;
        }

        li p.first {
            display: inline-block;
        }

        ul,
        ol {
            padding-left: 30px;
        }

        ul:first-child,
        ol:first-child {
            margin-top: 0;
        }

        ul:last-child,
        ol:last-child {
            margin-bottom: 0;
        }

        dl {
            padding: 0;
        }

        dl dt {
            font-size: 14px;
            font-weight: bold;
            font-style: italic;
            padding: 0;
            margin: 15px 0 5px;
        }

        dl dt:first-child {
            padding: 0;
        }

        dl dt> :first-child {
            margin-top: 0;
        }

        dl dt> :last-child {
            margin-bottom: 0;
        }

        dl dd {
            margin: 0 0 15px;
            padding: 0 15px;
        }

        dl dd> :first-child {
            margin-top: 0;
        }

        dl dd> :last-child {
            margin-bottom: 0;
        }

        blockquote {
            border-left: 4px solid #dddddd;
            padding: 0 15px;
            color: #777777;
        }

        blockquote> :first-child {
            margin-top: 0;
        }

        blockquote> :last-child {
            margin-bottom: 0;
        }

        table {
            border-collapse: collapse;
            padding: 0;
        }

        table tr {
            border-top: 1px solid #cccccc;
            background-color: white;
            margin: 0;
            padding: 0;
        }

        table tr:nth-child(2n) {
            background-color: #f8f8f8;
        }

        table tr th {
            font-weight: bold;
            border: 1px solid #cccccc;
            text-align: left;
            margin: 0;
            padding: 6px 13px;
        }

        table tr td {
            border: 1px solid #cccccc;
            text-align: left;
            margin: 0;
            padding: 6px 13px;
        }

        table tr th:first-child,
        table tr td:first-child {
            margin-top: 0;
        }

        table tr th:last-child,
        table tr td:last-child {
            margin-bottom: 0;
        }

        img {
            max-width: 100%;
        }

        span.frame {
            display: block;
            overflow: hidden;
        }

        span.frame>span {
            border: 1px solid #dddddd;
            display: block;
            float: left;
            overflow: hidden;
            margin: 13px 0 0;
            padding: 7px;
            width: auto;
        }

        span.frame span img {
            display: block;
            float: left;
        }

        span.frame span span {
            clear: both;
            color: #333333;
            display: block;
            padding: 5px 0 0;
        }

        span.align-center {
            display: block;
            overflow: hidden;
            clear: both;
        }

        span.align-center>span {
            display: block;
            overflow: hidden;
            margin: 13px auto 0;
            text-align: center;
        }

        span.align-center span img {
            margin: 0 auto;
            text-align: center;
        }

        span.align-right {
            display: block;
            overflow: hidden;
            clear: both;
        }

        span.align-right>span {
            display: block;
            overflow: hidden;
            margin: 13px 0 0;
            text-align: right;
        }

        span.align-right span img {
            margin: 0;
            text-align: right;
        }

        span.float-left {
            display: block;
            margin-right: 13px;
            overflow: hidden;
            float: left;
        }

        span.float-left span {
            margin: 13px 0 0;
        }

        span.float-right {
            display: block;
            margin-left: 13px;
            overflow: hidden;
            float: right;
        }

        span.float-right>span {
            display: block;
            overflow: hidden;
            margin: 13px auto 0;
            text-align: right;
        }

        pre,
        code,
        tt {
            font-size: 12px;
        }

        code,
        tt {
            margin: 0;
            padding: 0 5px;
            white-space: nowrap;
            border: 1px solid #eaeaea;
            background-color: #f8f8f8;
            border-radius: 3px;
        }

        pre code {
            margin: 0;
            padding: 0;
            white-space: pre;
            border: none;
            background: transparent;
        }

        .highlight pre {
            background-color: #f8f8f8;
            border: 1px solid #cccccc;
            font-size: 13px;
            line-height: 19px;
            overflow: auto;
            padding: 6px 10px;
            border-radius: 3px;
        }

        pre {
            background-color: #f8f8f8;
            border: 1px solid #cccccc;
            font-size: 13px;
            line-height: 19px;
            overflow: auto;
            padding: 6px 10px;
            border-radius: 3px;
        }

        pre code,
        pre tt {
            background-color: transparent;
            border: none;
        }
";

        #endregion

        #region KaTex Script
        public const string KatexScript = @"
<link rel=""stylesheet"" href=""html/katex/katex.min.css"">
<script defer             src=""html/katex/katex.min.js""></script>
<script defer             src=""html/katex/contrib/auto-render.min.js""></script>
<script>
    document.addEventListener(""DOMContentLoaded"", function()
    {
        renderMathInElement(document.body, {
        delimiters:
            [
                { left: '$$', right: '$$', display: true},
                { left: '$', right: '$', display: false},
                { left: '\\(', right: '\\)', display: false},
                { left: '\\[', right: '\\]', display: true}
            ],
            throwOnError: false
        });
    });
</script>
";
        #endregion

        #region MathJax Script

        public const string MathJaxScript = @"
        <script>
            MathJax = {
            tex: {
                inlineMath: [['$', '$'],['$$','$$'], ['\\(', '\\)']]
            }
            };
        </script>
        <!-- <script src=""https://polyfill.io/v3/polyfill.min.js?features=es6""></script> -->
        <script type = ""text/javascript"" id=""MathJax-script"" src=""mathjax/3.2.0/tex-mml-chtml.js""></script>
";

        #endregion

        #region Example Markdown

        public const string ExampleNormal = @"
# <p align='center'>计算机网络</p>

- <p align='right'>2022年4月</p>

## 01 概述

- 网络协议的三要素：
  - 1.语法 - 数据和控制信息的结构或格式
  - 2.语义 - 发送的控制信息、接收响应、接收动作
  - 3.同步 - 事件实现顺序
- [x] <u>下划线</u>
- [x] ~删除线~
- [x] ~~删除线~~
- [.] *加粗文本*

> 引用文本1
  >> 引用文本2<br>换行
  >> 行内代码`int x=0`行内代码

- 超链接
  - 外部链接：[百度](https://www.baidu.com/)
  - [页内链接](# 01)
---
分割线
***

###

";

        public const string ExampleGrid = @"
# <p align='center'>示例表格(居中的标题)</p>

## <p align='right'>普通表格(右对齐的标题)</p>

| OSI协议    | TCP/IP     | 五层协议模型 |
| ---------- | ---------- | ------------ |
| 应用层     | 应用层     | 应用层       |
| 表示层     | 应用层     | 应用层       |
| 会话层     | 应用层     | 应用层       |
| 运输层     | 运输层     | 运输层       |
| 网络层     | 网际层     | 网络层       |
| 数据链路层 | 网络接口层 | 数据链路层   |
| 物理层     | 网络接口层 | 物理层       |

## 可设置列对齐方式的表格（默认左对齐的标题）

| 层名称(默认左对齐)| 英文（右对齐） | 传输单位(居中对齐) | 作用                                    | 其他                        |
| ---------- | -----------------: | :--------------: | --------------------------------------- | --------------------------- |
| 应用层     | application layer | 数据           | 为用户提供服务                          | HTTP SMTP DNS RTP H.323 SIP |
| 运输层     | transport layer   | 报文段 segment | 提供复用和分用 TCP UDP                  | TCP UDP   SCTP              |
| 网络层     | network layer     | IP数据报       | 将上层数据封装分组或包                  | IP                          |
| 数据链路层 | data link layer   | 帧 frame       | 控制数据传输，将上层数据封装帧+控制信息 | IP                          |
| 物理层     | physical layer    | byte流         | 物理传输信号                            |                             |

## 可设置单元格文字颜色的表格

| 应用           | <font color='#00FF00'>应用层协议</font>| <font color='#FF0000'>运输层</font> |
| -------------- | --------------------- | ------ |
| 名字转换       | DNS 域名系统          | UDP    |
| 文件传送       | TFTP 简单文件传送协议 | UDP    |
| 路由选择协议   | RIP 路由信息协议      | UDP    |
| IP地址配置     | DHCP 动态主机配置协议 | UDP    |
| 网络管理       | SNMP 简单网络管理协议 | UDP    |
| 远程文件服务器 | NFS 网络文件系统      | UDP    |
| IP电话         | 专用协议              | UDP    |
| 流式多媒体通信 | 专用协议              | UDP    |
| 多播           | IGMP 网际组管理协议   | UDP    |
| 电子邮件       | SMTP 简单邮件传送协议 | TCP    |
| 远程终端接入   | TELNET 远程终端协议   | TCP    |
| 万维网         | HTTP 超文本传输协议   | TCP    |
| 文件传送       | FTP 文件传送协议      | TCP    |

## 代码块演示

- C语言代码
```C
int * p=&x;
p++;
```
---

- C#语言代码

```C#
object obj = new object();
```

***

- 运输层端口
  - 协议端口号 protocol port number(端口):仅用于本地计算机进程和运输层交互的层间接口
  - TCP/IP：使用16位端口号：0-65535
- 端口号分类：
  - 1.服务器使用的端口号
    - 1.1 熟知端口号或系统端口号：0-1023 (www.iana.org)
    - 1.2 登记端口号：1024-49151
  - 2.客户端使用的端口号：49152-65535

";

        public const string ExampleMath = @"
## 函数的微分

- 微分的定义：
  - $设函数y=f(x)在某区间内有定义，x_0以及x_0+\Delta x 在该区间内，若函数的增量：\Delta y = f(x+\Delta x) - f(x_0) 可表示为 \Delta y = A\Delta x + o(\Delta x),A是不依赖于\Delta x的常数,则称函数y=f(x)在点x_0是可微的，而A\Delta x 叫做函数y=f(x)在点x_0相当于自变量增量\Delta x的微分,记作dy，即dy=A\Delta x$
  - $$A = \lim_{\Delta x \to 0}{\frac{\Delta y}{\Delta x}} = f'(x_0)$$
  - 函数f(x)在点$x_0$可微的 充分必要条件 是 函数f(x)在点$x_0$可导,其微分为$dy = f'(x_0)\Delta x$
  - $$\Delta y = dy + o(dy)$$
  - 名词术语：主部、线性主部、函数的微分、自变量的微分
- 微分的几何意义：
  - 在某点附近，用切线段来近似代替曲线段；即在局部范围内用线性函数近似代替非线性函数
- 基本初等函数的微分公式
  - 函数的微分表达式：
    - $$dy = f'(x)dx$$

| 导数公式                                                | 微分公式                                                     |
| ------------------------------------------------------- | ------------------------------------------------------------ |
| $y'=f'(x)$                                              | $dy = df(x) = f'(x)dx$                                       |
| $(x^\mu)' = \mu x^{\mu -1}$                             | $d(x^\mu) = \mu x^{\mu - 1}dx$                               |
| $(\sin x)' = \cos x$                                    | $d(\sin x) = \cos xdx$                                       |
| $(\cos x)' = -\sin x$                                   | $d(\cos x) = -\sin xdx$                                      |
| $(\tan x)' = \sec^2 x$                                  | $d(\tan x) = \sec^2 xdx$                                     |
| $(\cot x)' = -\csc^2 x$                                 | $d(\cot x) = -\csc^2 xdx$                                    |
| $(\sec x)' = \sec x \tan x$                             | $d(\sec x) =\sec x \tan x dx$                                |
| $(\csc x)' = -\csc x \cot x$                            | $d(\csc x) = -\csc x \cot x dx$                              |
| $(a^x)' = a^x \ln a\ (a>0\ and\ a \neq 0)$              | $d(a^x) = a^x\ln a dx \ (a>0\ and\ a\neq 0)$                 |
| $(e^x)' = e^x$                                          | $d(e^x) = e^xdx$                                             |
| $(\log_a{x})' = \frac{1}{x\ln a}\ (a>0\ and\ a \neq 1)$ | $d(\log_a{x}) = \frac{1}{x\ln a}dx \ (a>0 \ and \ a \neq 1)$ |
| $(\ln x)' = \frac{1}{x}$                                | $d(\ln x) = \frac{1}{x}dx$                                   |
| $(\arcsin x)' = \frac{1}{\sqrt{1-x^2}}$                 | $d(\arcsin x) = \frac{1}{\sqrt{1-x^2}} dx$                   |
| $(\arccos x)' = -\frac{1}{\sqrt{1-x^2}}$                | $d(\arccos x) = -\frac{1}{\sqrt{1-x^2}}dx$                   |
| $(\arctan x)' = \frac{1}{1 + x^2}$                      | $d(\arctan x) = \frac{1}{1+x^2}dx$                           |
| $(arccot\ x)' = - \frac{1}{1 + x^2}$                    | $d(arccot\ x) = -\frac{1}{1 + x^2}dx$                        |
| $(\sh x)' = \ch x$                                      | $d(\sh x) = \ch{x}dx$                                        |
| $(\ch x)' = \sh x$                                      | $d(\ch x) = \sh{x}dx$                                        |
| $(\th x)' = \frac{1}{(\ch x)^2}$                        | $d(\th x) = \frac{1}{(\ch x)^2}dx$                           |
| $(arsh x)'=\frac{1}{\sqrt{x^2+1}}$                      | $d(arsh x) = \frac{1}{\sqrt{x^2 + 1}}$dx                     |
| $(arch x)' = \frac{1}{\sqrt{x^2 - 1}}$                  | $d(arch x) = \frac{1}{\sqrt{x^2 - 1}}dx$                     |
| $(arth x)' = \frac{1}{1 - x^2}$                         | $d(arth x) = \frac{1}{1 - x^2}dx$                            |

- 函数和差积商的微分法则

| 求导法则                                           | 微分法则                                             |
| -------------------------------------------------- | ---------------------------------------------------- |
| $(u \pm v)' = u' \pm v'$                           | $d(u \pm v) = du \pm dv$                             |
| $(Cu)' = Cu'$                                      | $d(Cu) = Cdu$                                        |
| $(uv)' = u'v + uv'$                                | $d(uv) = udv + vdu$                                  |
| $(\frac{u}{v})' = \frac{u'v-uv'}{v^2}\ (v \neq 0)$ | $d(\frac{u}{v}) = \frac{vdu - udv}{v^2}\ (v \neq 0)$ |

- 复合函数的微分法则
  - 微分形式不变性：$y=f(u),u=g(x),y=f[g(x)],dy =f'(u)du = f'(u)g'(x)dx$
  - Tip:根据微分求原始函数时需要加常数C，$d(f(x)+C) = f'(x)dx$
- 微分在近似计算中的应用
  - 函数的近似计算：$当 \Delta x 很小时，\Delta y \approx dy = f'(x)\Delta x$
  - 即：$\Delta y = f(x_0 + \Delta x) - f(x_0) \approx f'(x_0)\Delta x$
  - 那么:$f(x_0 + \Delta x) \approx f(x_0) + f'(x_0)\Delta x$
  - 令$x = x_0 + \Delta x ,则 f(x) \approx f(x_0) + f'(x_0)(x - x_0)$
  - 即：用曲线$y=f(x),在点(x_0,f(x_0))处的切线来近似代替该曲线$
  - 当x取0时，$f(x) \approx f(0) + f'(0)x$
  - 常用的在工程上是近似公式：
    - $$(1 + x)^\alpha \approx 1 + \alpha x \quad (\alpha \in R)$$
    - $$ \sin x \approx x \quad (x用弧度单位表示)$$
    - $$ \tan x \approx x \quad (x用弧度单位表示)$$
    - $$ e^x \approx 1 + x$$
    - $$\ln (1 + x) \approx x$$
  - 误差估计：
    - 术语名称：
      - 间接测量误差，绝对误差=$|A-a|$,相对误差=$\frac{|A - a|}{|a|}$ , 绝对误差限=$\delta _A = |A - a|$ , 相对误差限 = $\frac{\delta_A}{a}$
    - 一般，若y=f(x)的直接测量值为x,若要计算y,x的绝对误差限为$\delta_x,即 |\Delta x| \leq \delta_x,$
    - 当$y' \neq 0 时，y的绝对误差\Delta y \approx |dy| = |y'| \cdot |\Delta x| \leq |y'|\cdot \delta_x,则y的绝对误差限为：\delta_y = |y'|\cdot \delta_x,$
    - y的相对误差限：
    - $$\frac{\delta_y}{|y|} = \left|\frac{y'}{y} \right| \cdot \delta_x$$
";

        public const string ExampleFlow = @"

";

        #endregion
    }
}
